﻿/*
 * The HiPerfTimer class was made by Daniel Strigl
 * http://www.codeproject.com/csharp/highperformancetimercshar.asp
 */

using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading;


namespace Jerkymon
{
    /// <summary>
    /// Summary description for HiPerfTimer.
    /// </summary>
    public class HiPerfTimer
    {
		#region Static Methods (2)
		[DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

		[DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(out long lpFrequency);
		#endregion

		#region Fields (3)
		private long freq;
		private long startTime, stopTime;
		#endregion

		#region Properties (1)
		// Returns the duration of the timer (in seconds)
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double)freq;
            }
        }
		#endregion

		#region Constructors (1)
		// Constructor
        public HiPerfTimer(bool bStart)
        {
            startTime = 0;
            stopTime = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // high-performance counter not supported
                throw new Win32Exception();
            }

            if (bStart) Start();
        }
		#endregion

		#region Methods (2)

		// Start the timer
        public void Start()
        {
            // lets do the waiting threads there work
           Thread.Sleep(0);

            QueryPerformanceCounter(out startTime);
        }

		// Stop the timer
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }

		#endregion
    }
}
